#include <iostream>

class Base
{
public:
    virtual void show()  // 虚函数
    {
        std::cout << "Base\n";
    }
};

class Derived1 : public Base
{
public:
    void show()
    {
        std::cout << "Derived1\n";
    }
};

class Derived2 : public Base
{
public:
    void show()   // 子类函数和父类函数完全相同：重写
    {
        std::cout << "Derived2\n";
    }
};

int main()
{
    Derived1* d1 = new Derived1;
    Derived2* d2 = new Derived2;

    // d1->show();
    // d2->show();

    // C++允许将子类指针转成基类指针：向上转型
    // Base *b1 = d1;
    // Base *b2 = d2;

    // Derived1 *t = b1; // 向下转型：基类指针转化为子类指针：不被允许的

    Base *b = d1;
    b->show();
    b = d2;
    b->show();

    // 多态：同一句代码，不同的功能

    // C++多态：
    //     1.基类指针指向子类对象
    //     2.基类定义虚函数
    //     3.子类重写父类虚函数

    // 重写 和 名词遮蔽
    //  1.重写 完全相同
    //  2.名词遮蔽 函数名相同

    return 0;
}
